package com.qf.factory;

import java.util.Properties;

/**
 * 自定义Bean工厂, 所有的对象由工厂产生创建. Bean就是java对象
 * 优点: 避免在业务代码中, 使用new进行创建, 因为new创建对象会导致代码耦合度过高.
 * @author 千锋健哥
 */
public class BeanFactory {

    //加载bean.properties文件中的内容
    private Properties properties = new Properties();

    //无参构造
    public BeanFactory() {
    }

    /**
     * 构造方法, 通过bean的名字, 到bean.properties中获取对应的实现类全限定名
     * config为配置文件路径以及配置文件的文件名
     */
    public BeanFactory(String config) throws Exception {
        //通过输入流读取配置文件中的内容, 加载到Properties对象中
        properties.load(BeanFactory.class.getResourceAsStream(config));
    }

    /**
     * 通过beanName名字, 到properties对象中找到对应的实现类的全限定名
     * 然后通过反射获取这个对象并返回
     * @param beanName
     * @return
     */
    public Object getBean(String beanName) throws Exception {
        //从properties对象中获取类的路径
        String classPath = properties.getProperty(beanName);
        //判断路径不为空
        if (classPath != null) {
            //通过反射加载类对象
            Class clazz = Class.forName(classPath);
            //通过反射获取具体实例对象返回
            return clazz.newInstance();
        }
        return null;
    }

}
